#!/usr/bin/env python

from nose.tools import *
from utilities import execution_path
from copy import deepcopy

import os, mapnik

def setup():
    # All of the paths used are relative, if we run the tests
    # from another directory we need to chdir()
    os.chdir(execution_path('.'))

# map has no layers
@raises(IndexError)
def test_map_query_throw1():
    m = mapnik.Map(256,256)
    m.zoom_to_box(mapnik.Box2d(-1,-1,0,0))
    m.query_point(0,0,0)

# only positive indexes
@raises(IndexError)
def test_map_query_throw2():
    m = mapnik.Map(256,256)
    m.query_point(-1,0,0)

# map has never been zoomed (nodata)
@raises(RuntimeError)
def test_map_query_throw3():
    m = mapnik.Map(256,256)
    m.query_point(0,0,0)

# map has never been zoomed (even with data)
@raises(RuntimeError)
def test_map_query_throw4():
    m = mapnik.Map(256,256)
    mapnik.load_map(m,'../data/good_maps/agg_poly_gamma_map.xml')
    m.query_point(0,0,0)

# invalid coords in general (do not intersect)
@raises(RuntimeError)
def test_map_query_throw5():
    m = mapnik.Map(256,256)
    mapnik.load_map(m,'../data/good_maps/agg_poly_gamma_map.xml')
    m.zoom_all()
    m.query_point(0,9999999999999999,9999999999999999)

# invalid coords for back projecting
@raises(RuntimeError)
def test_map_query_throw6():
    m = mapnik.Map(256,256)
    mapnik.load_map(m,'../data/good_maps/merc2wgs84_reprojection.xml')
    wgs84_bounds = mapnik.Box2d(-180,-90,180,90)
    m.maximum_extent = wgs84_bounds
    m.zoom_all()
    m.query_point(0,-180,-90)

def test_map_query_works1():
    m = mapnik.Map(256,256)
    mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
    merc_bounds = mapnik.Box2d(-20037508.34,-20037508.34,20037508.34,20037508.34)
    m.maximum_extent = merc_bounds
    m.zoom_all()
    fs = m.query_point(0,-11012435.5376, 4599674.6134) # somewhere in kansas
    feat = fs.next()
    eq_(feat.attributes['NAME_FORMA'],u'United States of America')

def test_map_query_works2():
    m = mapnik.Map(256,256)
    mapnik.load_map(m,'../data/good_maps/merc2wgs84_reprojection.xml')
    wgs84_bounds = mapnik.Box2d(-179.999999975,-85.0511287776,179.999999975,85.0511287776)
    m.maximum_extent = wgs84_bounds
    # caution - will go square due to evil aspect_fix_mode backhandedness
    m.zoom_all()
    #mapnik.render_to_file(m,'works2.png')
    # valid that aspec_fix_mode modified the bbox
    eq_(m.envelope(),mapnik.Box2d(-179.999999975,-179.999999975,179.999999975,179.999999975))
    fs = m.query_point(0,-98.9264, 38.1432) # somewhere in kansas
    feat = fs.next()
    eq_(feat.attributes['NAME'],u'United States')

def test_map_query_in_pixels_works1():
    m = mapnik.Map(256,256)
    mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
    merc_bounds = mapnik.Box2d(-20037508.34,-20037508.34,20037508.34,20037508.34)
    m.maximum_extent = merc_bounds
    m.zoom_all()
    fs = m.query_map_point(0,55,100) # somewhere in middle of us
    feat = fs.next()
    eq_(feat.attributes['NAME_FORMA'],u'United States of America')

def test_map_query_in_pixels_works2():
    m = mapnik.Map(256,256)
    mapnik.load_map(m,'../data/good_maps/merc2wgs84_reprojection.xml')
    wgs84_bounds = mapnik.Box2d(-179.999999975,-85.0511287776,179.999999975,85.0511287776)
    m.maximum_extent = wgs84_bounds
    # caution - will go square due to evil aspect_fix_mode backhandedness
    m.zoom_all()
    # valid that aspec_fix_mode modified the bbox
    eq_(m.envelope(),mapnik.Box2d(-179.999999975,-179.999999975,179.999999975,179.999999975))
    fs = m.query_map_point(0,55,100) # somewhere in middle of us
    feat = fs.next()
    eq_(feat.attributes['NAME'],u'United States')

if __name__ == "__main__":
    setup()
    [eval(run)() for run in dir() if 'test_' in run]
